#include <iostream>
#include <fstream>
#include <cctype>
#include <cstring>  // 用于 strcmp
using namespace std;

// 函数声明（拆分功能，便于维护）
int countChars(ifstream& file);
int countWords(ifstream& file);
int countSentences(ifstream& file);
int countLines(ifstream& file);
int countBlankLines(ifstream& file);
int countCommentLines(ifstream& file);
void resetFile(ifstream& file);  // 重置文件指针

int main(int argc, char *argv[]) {
    // 参数校验
    if (argc != 3) {
        puts("用法：wc.exe [参数] 文件名");
        puts("参数说明：");
        puts("  -c    统计字符数");
        puts("  -w    统计单词数");
        puts("  -s    统计句子数");
        puts("  -l    统计总行数");
        puts("  -b    统计空行数");
        puts("  -m    统计注释行（//开头）");
        return 1;
    }

    // 解析参数
    char *param = argv[1];
    char *filename = argv[2];

    // 打开文件（兼容Dev-C++）
    ifstream file(filename);
    if (!file.is_open()) {
        puts("错误：文件无法打开！");
        return 1;
    }

    // 根据参数执行统计
    if (strcmp(param, "-c") == 0) {
        printf("字符数：%d\n", countChars(file));
    } else if (strcmp(param, "-w") == 0) {
        printf("单词数：%d\n", countWords(file));
    } else if (strcmp(param, "-s") == 0) {
        printf("句子数：%d\n", countSentences(file));
    } else if (strcmp(param, "-l") == 0) {
        printf("总行数：%d\n", countLines(file));
    } else if (strcmp(param, "-b") == 0) {
        printf("空行数：%d\n", countBlankLines(file));
    } else if (strcmp(param, "-m") == 0) {
        printf("注释行数：%d\n", countCommentLines(file));
    } else {
        puts("错误：无效参数！");
        file.close();
        return 1;
    }

    file.close();
    return 0;
}

// 统计字符数（所有字符，包括空格、换行）
int countChars(ifstream& file) {
    int count = 0;
    char ch;
    while (file.get(ch)) {
        count++;
    }
    return count;
}

// 统计单词数（连续非空白字符为一个单词）
int countWords(ifstream& file) {
    int count = 0;
    bool inWord = false;
    char ch;
    while (file.get(ch)) {
        if (isspace(ch)) {
            inWord = false;
        } else if (!inWord) {
            count++;
            inWord = true;
        }
    }
    return count;
}

// 统计句子数（以.、!、?结尾）
int countSentences(ifstream& file) {
    int count = 0;
    char ch;
    while (file.get(ch)) {
        if (ch == '.' || ch == '!' || ch == '?') {
            count++;
        }
    }
    return count;
}

// 统计总行数
int countLines(ifstream& file) {
    int count = 1;  // 至少1行（空文件也算1行）
    char ch;
    while (file.get(ch)) {
        if (ch == '\n') {
            count++;
        }
    }
    return count;
}

// 统计空行数（仅含空格/制表符或空行）
int countBlankLines(ifstream& file) {
    int count = 0;
    string line;
    while (getline(file, line)) {
        bool isBlank = true;
        for (size_t i = 0; i < line.size(); i++) {
            if (!isspace(static_cast<unsigned char>(line[i]))) {
                isBlank = false;
                break;
            }
        }
        if (isBlank) {
            count++;
        }
    }
    return count;
}

// 统计注释行（以//开头的行）
int countCommentLines(ifstream& file) {
    int count = 0;
    string line;
    while (getline(file, line)) {
        size_t pos = 0;
        // 跳过行首空白字符
        while (pos < line.size() && isspace(static_cast<unsigned char>(line[pos]))) {
            pos++;
        }
        // 检查是否以//开头
        if (pos + 1 < line.size() && line[pos] == '/' && line[pos+1] == '/') {
            count++;
        }
    }
    return count;
}

// 重置文件指针到开头（复用文件时使用）
void resetFile(ifstream& file) {
    file.clear();    // 清除错误状态
    file.seekg(0);   // 移动指针到文件开头
}r